package cn.group7.padserver.service.impl;

import cn.group7.padserver.dao.OrderDao;
import cn.group7.padserver.entity.Page;
import cn.group7.padserver.pojo.Order;
import cn.group7.padserver.service.OrderService;
import cn.hutool.core.util.StrUtil;
import jakarta.annotation.Resource;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author XXX
 * @description 订单业务实现类
 * @createTime 2024/7/22 下午3:10
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderDao orderDao;

    /**
     * 测试订单业务（随机返回10条记录）
     *
     * @return 10条记录
     */
    @Override
    public List<Order> queryOrdersRandom() {
        return orderDao.queryOrdersRandom();
    }

    /**
     * 根据页码获取订单信息
     *
     * @param pageNum  页码
     * @param pageSize 每页显示的条数
     * @param flag     查询类型
     * @return 订单信息
     */
    @Override
    public Page<Order> getOrdersByPage(Integer pageNum, Integer pageSize, String flag) {
        // 页码小于等于1，则默认为1
        if (pageNum <= 1) {
            pageNum = 1;
        }
        //开始页码-1*每页显示的条数
        int start = (pageNum - 1) * pageSize;
        Map<String, Object> map = new HashMap<>(1);
        map.put("flag", flag);
        map.put("start", start);
        map.put("pageSize", pageSize);
        Page<Order> page = new Page<>();
        page.setData(orderDao.queryOrdersByPage(map));
        page.setPageNum(pageNum);
        page.setTotal(orderDao.selectTotal(map));
        page.setPageSize(pageSize);
        return page;
    }

    /**
     * 根据关键字查询商品（订单）
     *
     * @param pageNum  页码
     * @param pageSize 每页显示的条数
     * @param keys     关键字
     * @param flag     查询类型
     * @return 商品（订单）信息
     */
    @Override
    public Page<Order> selectByKeys(Integer pageNum, Integer pageSize, String keys, String flag) {
        // 页码小于等于1，则默认为1
        if (pageNum <= 1) {
            pageNum = 1;
        }
        //开始页码-1*每页显示的条数
        int start = (pageNum - 1) * pageSize;
        Map<String, Object> map = new HashMap<>(1);
        map.put("keys", keys);
        map.put("flag", flag);
        map.put("start", start);
        map.put("pageSize", pageSize);
        Page<Order> page = new Page<>();
        page.setData(orderDao.selectByKeys(map));
        page.setPageNum(pageNum);
        page.setTotal(orderDao.selectTotal(map));
        page.setPageSize(pageSize);
        return page;
    }

    /**
     * 根据id查询订单
     *
     * @param orderId 订单id
     * @return 订单信息
     */
    @Override
    public Order queryOrderById(Integer orderId) {
        return orderDao.selectOrderById(orderId);
    }

    /**
     * 根据用户名查询订单
     *
     * @param pageNum  页码
     * @param pageSize 每页显示的条数
     * @param keys     关键字
     * @param flag     查询类型
     * @return 订单信息
     */
    @Override
    public Page<Order> queryOrderByUsername(Integer pageNum, Integer pageSize, String keys, String flag) {
        //获取登录的用户名
        UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String name = principal.getUsername();
        // 页码小于等于1，则默认为1
        if (pageNum <= 1) {
            pageNum = 1;
        }
        //开始页码-1*每页显示的条数
        int start = (pageNum - 1) * pageSize;
        Map<String, Object> map = new HashMap<>(1);
        map.put("keys", keys);
        map.put("flag", flag);
        map.put("start", start);
        map.put("pageSize", pageSize);
        map.put("username", name);
        Page<Order> page = new Page<>();
        page.setData(orderDao.selectOrderByUsername(map));
        page.setPageNum(pageNum);
        page.setTotal(orderDao.selectTotalByUsername(map));
        page.setPageSize(pageSize);
        return page;
    }

    /**
     * 添加订单
     *
     * @param order 订单信息
     * @param flag  查询类型
     * @return 是否添加成功
     */
    @Override
    public boolean addOrder(Order order, String flag) {
        //获取登录的用户名
        UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        order.setOwnName(principal.getUsername());
        //判断需求
        if(StrUtil.isBlank(order.getType())){
            order.setType(flag);
        }
        order.setOrderStatus(0);
        order.setCreateTime(new Date());
        order.setUpdateTime(new Date());
        return orderDao.addOrder(order)==1;
    }

    /**
     * 修改订单
     *
     * @param order 订单信息
     * @param flag  查询类型
     * @return 是否修改成功
     */
    @Override
    public boolean updateOrder(Order order, String flag) {
        //判断需求
        if(StrUtil.isBlank(order.getType())){
            order.setType(flag);
        }
        return orderDao.updateOrder(order)==1;
    }

    /**
     * 删除订单
     *
     * @param orderId 订单id
     * @return 是否删除成功
     */
    @Override
    public boolean deleteOrder(Integer orderId) {
        return orderDao.deleteOrder(orderId)==1;
    }
}
